package dancereal;

public class J06_Conversion {


	// 형변환 Conversion
	// 서로 다른 자료형을 처리할 때 종종 변환이 필요
	// float avg = (float)tot / 3;

    // 두 변수가 같은 자료형이라면 대입은 성공적으로 처리
	// 같은 유형으로 변환하는 것을 동질성 변환이라 함
	
	// 하지만, 다른 유형으로의 변환은 성공을 보장 못함
	// 기본 자료형 변환에는 확대/축소 변환이 있음 
	// 첫번째 유형에 비해 두번째 유형의 크기가
	// 같거나 클 때 발생함
	// 확대변환시 정보 손실의 위험은 발생하지 않음
	// 단, 정밀도 손실이 간혹 발생할 수 있음
	// 확대 변환은 암시적으로 일어남
	
	// 축소 형변환 narrowing conversion 
	// long 형에서  long 형으로의 변환처럼
	// 첫번째 유형에 비해 두번째 유형의 크기가
	// 작을 때 발생함
	// 축소 형변환은 확대 형변환과 달리  명시적이어야 함
	// 괄호안에 변환하려는 유형을 지정(cast 연산자)
	// (float)는 컴파일러에게 float 형으로 
	// 변환할것을 지시함
	// 정보 손실이 발생 할 수 있기 때문에 유의해야 함
	// 이것은 프로그램의 결함을 야기함
	
		
	
 public static void main(String[] args){
	
		// 동질성 변환 identity conversion
		int a = 90;
		int b = a;
		
	// 확대 형변환
	long c = a;
		
	// 축소 형변환
	int d = (int)c;
		
	// 축소 형변환으로 인한 정보손실
    long e = 1234567890123L;
    int f = (int) e;
    
    System.out.println(e);
    System.out.println(f);
	
    //연산자 우선순위
    int g = 1;
    int h = 2;
    int i = 3;
    int j = g + h * i;
    
    // 모든 연산자에는 우선순위가 있음
    // 가장 높은 우선순위는 (),++,--
 
    int k = 5;
    int l = 5;
    boolean m = k * 5 == l + 20;
    
    System.out.println(j);
    System.out.println(m);
    
    // 승격 promotion
    byte n = 5;
    byte o = n;
    // 놀랍게도 오류 발생!
    // 단항 연산자 -에 의해 n 변수가 int 형으로 승격
    // 문제 해결을 위해 명시적 축소 형변환을 사용하거나 
    // 변수를 int 형으로 바꾸면 됨
    
    byte oo = (byte)-n;
    int p = -n;
    
    short q = 100;
    short r = 200;
    //short s = q + r; // 오류 발생!!
   
    // 이항 연산자 + 에 의해
    // q,r 변수가 int형으로 승격
    
    short s = (short)(q+r);
    int t = q + r;
    
    // 주석 comments
    // 프로그램 코드에 덧붙이는 설명문, 해설
    // 컴파일러가 소스를 컴파일 할 때
    // 주석은 무시하고 넘어감
    // 해당 코드가 제공하는 기능, 용도, 의미를
    // 쉽게 파악하도록 하기 위해 주석을 다는 것은
    // 좋은 습관임
    // 자바에서는 2가지 주석 유형 제공 - c,c++과 유사
    // 전통적인 주석은 /*와 */사이에 주석을 작성
    // 주의)중첩해서 사용하면 안됨!!
    // 한줄 주석인 //는 코드 끝에 작성하는 주석
    
    // /* /* */ */ 처럼 주석을 중첩하면 안됨
    
    // 연결 join 연산자 + (concatenate) 
    // 일반적으로 + 연산자는 두 수를 더하는 기능을 가짐
    // 하지만, 문자나 문자열에 + 연산자를 사용하면
    // 앞의 문자와 뒤의 문자를 연결(합치는)해줌
    
    char u = '가';
    char v = '나';
    System.out.println(u);
    System.out.println(v);
    System.out.println(u+v); //승격으로 인해 숫자출력
    System.out.println("" +u+v); //위의 해결책
    
    //하지만,문자에 사용하는 + 연산자로 인한
    //오버헤드 때문에 StringBuilder 클래스를 주로 사용
    
        
    
    
    
	}

}
